/********************************************************************************************
@descr This file contains helper predicates for checkers game, the board is represented like
a List of List.
@autor Christian Arias
@date  10 june 2011
********************************************************************************************/
:-include('base').
piece_type(r).
piece_type(q).
player(r).
player(b).

/********************************************************************************************
@descr Return in M the next file for a piece on file N. If the player si RED it goes down
********************************************************************************************/
nextFile(r,N,M):-M is N + 1,M < 8.
nextFile(b,N,M):-M is N - 1,M > -1.
nextCol(1,N,M):-M is N+1,M < 8.
nextCol(-1,N,M):-M is N-1,M > -1.
piece(PI,PL):-piece_type(PI),player(PL).
piece(n,e).
no_player(n).
no_piece(e).
defr(R):-R=piece(r,r).
defb(B):-B=piece(r,b).
defe(E):-E=piece(n,e).
adversary(r,b).
adversary(b,r).

/*
initial_board(X):-X=[[(e,n),(r,r),(e,n),(r,r),(e,n),(r,r),(e,n),(r,r)],
				[(r,r),(e,n),(r,r),(e,n),(r,r),(e,n),(r,r),(e,n)],
               [(e,n),(r,r),(e,n),(r,r),(e,n),(r,r),(e,n),(r,r)],
               [(e,n),(e,n),(e,n),(e,n),(e,n),(e,n),(e,n),(e,n)],
               [(e,n),(e,n),(e,n),(e,n),(e,n),(e,n),(e,n),(e,n)],
               [(r,b),(e,n),(r,b),(e,n),(r,b),(e,n),(r,b),(e,n)],
               [(e,n),(r,r),(e,n),(r,r),(e,n),(r,r),(e,n),(r,r)],
               [(r,b),(e,n),(r,b),(e,n),(r,b),(e,n),(r,b),(e,n)]].
 */              
initial_board(X):-defr(R),defb(B),defe(E),
               X=[[E,R,E,R,E,R,E,R],
				  [R,E,R,E,R,E,R,E],
				  [E,R,E,R,E,R,E,R],
				  [E,E,E,E,E,E,E,E],	               
				  [E,E,E,E,E,E,E,E],	               
				  [B,E,B,E,B,E,B,E],
				  [E,B,E,B,E,B,E,B],
				  [B,E,B,E,B,E,B,E]].
				  
test_e_board2(X):-defr(R),defb(B),defe(E),
               X=[[E,R,E,R,E,R,E,R],
				  [R,E,R,E,R,E,R,E],
				  [E,R,E,R,E,R,E,R],
				  [E,E,B,E,E,E,E,E],	               
				  [E,E,E,E,E,E,E,E],	               
				  [B,E,B,E,B,E,B,E],
				  [E,E,E,B,E,E,E,B],
				  [B,E,B,E,B,E,B,E]].

% Devuelve los movimientos posibles de una pieza normal de un color determinado
% B es el tablero (Board)
% E es el estado (Para cumplir con el estandar definido que aunque en damas no es necesario, en otros juego si  lo
% pueden ser. Por ejemplo en ajedrez, se debe conocer si el rey se ha movido o no para saber si se puede hacer un enroque
% SX y SY son las coordenadas de la posición donde se encuentra la pieza
% TX y TY son las coordenadas donde se va a mover la pieza

mov_r(SB,_,SX,SY,P,TB,_,TX,TY):-getXY0(SB,SX,SY,piece(r,P)),nextFile(P,SX,TX),nextCol(_,SY,TY),getXY0(SB,TX,TY,piece(n,e)),exchange(SB,SX,SY,TX,TY,TB).
mov_re(SB,_,SX,SY,P,TB,_,TX,TY):-getXY0(SB,SX,SY,piece(r,P)),nextFile(P,SX,TTX),nextCol(SIDE,SY,TTY),adversary(P,A),getXY0(SB,TTX,TTY,piece(_,A)),
                                nextFile(P,TTX,TTTX),nextCol(SIDE,TTY,TTTY),getXY0(SB,TTTX,TTTY,piece(n,e)),rpMxT(SB,TTX,TTY,piece(n,e),TTB),
%                                nextFile(P,TTX,TX),nextCol(SIDE,TTY,TY),getXY0(SB,TX,TY,piece(n,e)),rpMxT(SB,TTX,TTY,piece(n,e),TTB),
%                               exchange(TTB,SX,SY,TX,TY,TB).
                                exchange(TTB,SX,SY,TTTX,TTTY,TTTB),
                                mov_re(TTTB,e,TTTX,TTTY,P,TB,_,TX,TY).
mov_re(SB,e,TX,TY,_,SB,_,TX,TY).
                                
%mov_r(SB,_,SX,SY,P,TB,_,TX,TY):-getXY0(SB,SX,SY,piece(r,P)),nextFile(P,SX,TTX),nextCol(SY,TTY),getXY0(SB,TTX,TTY,piece(_,P)),

